/**
  ******************************************************************************
  * @author     Chris
  * @since      2023/10/17 10:36
  *
  * @file       hd_24cxx.c
  * @brief      Xxx Hardware Driver.
  *
  * @note       This file contains the hardware driver for the Xxx.
  *
  * @warning    None.
  ******************************************************************************
  * Change Logs:
  *   Date           Author       Notes
  *   2023/10/17     Chris        the first version
  *
  ******************************************************************************
  */

#include "stm32g4xx.h"
#include "pd_h_i2c.h"
#include "hd_24cxx.h"

/** region Declaration and Definition Region */

/** region Variables and Constants Region */

/** endregion Variables and Constants Region */

/** region Function Declaration Region */

/** endregion Function Declaration Region */

/** endregion Declaration and Definition Region */


/** region Public Definition Region */


/**
  * @brief  24Cxx 初始化
  *
  * @note   STM32G4xx引脚位置：
  * @retval 无
  */
void HD_24Cxx_Init(void) {
    PD_H_I2C1_Init();
}

/**
  * @brief  24Cxx 页读取
  *
  * @note   24C02：8 字节每页；其它型号则 16 字节每页。
  * @param  regAddress   待写入的寄存器地址
  * @param  dat          待写入的数据
  * @param  len          待写入的数据长度
  * @retval 无
  */
void HD_24Cxx_Read(uint8_t regAddress, uint8_t *dat, uint8_t len) {
    PD_H_I2C_ReadBytes(I2C2, HD_24CXX_ADDRESS, regAddress, dat, len);
}


/**
  * @brief  24Cxx 页写入
  *
  * @note   24C02：8 字节每页；其它型号则 16 字节每页。
  * @param  regAddress   待写入的寄存器地址
  * @param  dat          待写入的数据
  * @param  len          待写入的数据长度
  * @retval 无
  */
void HD_24Cxx_Write(uint8_t regAddress, uint8_t *dat, uint8_t len) {
    uint8_t pageMagic = HD_24CXX_PAGE - 1;
    // 首先写入从起始地址到分页的部分
    PD_H_I2C_WriteBytes(I2C2, HD_24CXX_ADDRESS, regAddress, dat, regAddress & pageMagic);

    dat += regAddress & pageMagic;              // 数据指针偏移（待定）
    regAddress += (regAddress & pageMagic);     // 寄存器偏移
    len -= (regAddress & pageMagic);            // 长度偏移

    uint8_t lenRemain = len % 8;    // 结尾不足一页的数据长度
    len /= HD_24CXX_PAGE;           // 页数
    while (len--) {
        PD_H_I2C_WriteBytes(I2C2, HD_24CXX_ADDRESS, regAddress, dat, HD_24CXX_PAGE);
        regAddress += HD_24CXX_PAGE;// 寄存器地址偏移一页
        dat += HD_24CXX_PAGE;       // 数据指针偏移一页
    }

    // 最后写入不足一页的数据
    PD_H_I2C_WriteBytes(I2C2, HD_24CXX_ADDRESS, regAddress, dat, lenRemain);
}

/** endregion Public Definition Region */


/** region Private Definition Region */

/** endregion Private Definition Region */
